package design_pattern.ThreadLocal.Execution;

import java.util.function.Consumer;

/**
 * @Author: 蔡翔
 * @Date: 2019/11/11 14:44
 * @Version 1.0
 * 在多个服务中，上下文的作用(用threadLocal方式实现)
 */
public class ExecutionTask implements Runnable {
    private QueryFromDBAction queryAction = new QueryFromDBAction();
    private QueryFromHttpAction queryFromHttpAction = new QueryFromHttpAction();

    @Override
    public void run() {
        //在用线程池的时候，如果一个线程被回收，那么ThreadLocal中与之对应的数据并不会删除，所以这里要重置一下
        // 这里写重置 ThreadLocal的方法。

        queryAction.execute();
        System.out.println("The name query successful");
        queryFromHttpAction.execute();
        System.out.println("The cardId query successful");
        // （重要）注意这里直接获取 getContext()就行了，因为初始化 就已经new 好了 ，相同的线程 在不同的地方 get 和set 用的 都是同一份数据
        final Context context = ActionContext.getActionContext().getContext();
        System.out.println("The name is "+context.getName()+" and CardId " + context.getCardId());
    }
}